package com.zyh.answer.domain;

import java.util.Arrays;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;

/**
 * 度量因子枚举
 *
 * @author ZYH
 * @version 1.0
 * @date 2025-03-09
 */
public enum SymptomCluster {
    SOMATIZATION("躯体化", "0", "躯体化维度主要反映主观的身体不适感，包括心血管、胃肠道、呼吸等系统的不适，和头痛、背痛、肌肉酸痛、以及焦虑的其他躯体表现。"),
    OBSESSIVE_COMPULSIVE("强迫症状", "1", "强迫症状维度主要指那种明知没有必要、但又无法摆脱的无意义的思想、冲动、行为等表现，还有一些比较一般的感知障碍(如\"脑子都变空了\"，\"记忆力不行\"等)。"),
    INTERPERSONAL_SENSITIVITY("人际关系敏感", "2", "人际关系敏感维度主要指个人存在的不自在感与自卑感，尤其在与其他人相比较时更突出。自卑感、懊丧，以及人事关系明显相处不好的人，往往是这一维度的高分对象，与人际交流有关的自我敏感及反相期望也是产生这方面症状的原因。"),
    DEPRESSION("抑郁", "3", "抑郁维度反映的是抑郁苦闷的感情和心境，具有对生活兴趣减退，缺乏活动愿望，丧失活动力等行为特征，包括失望、悲观，与抑郁相联系的其他感知及躯体方面的问题。"),
    ANXIETY("焦虑", "4", "焦虑维度包括一些与临床上明显与焦虑症状相联系的症状及体验，一般指那些无法静息、神经过敏、紧张以及由此产生躯体反应(如震颤)。"),
    HOSTILITY("敌对", "5", "敌对维度主要从思想、感情及行为等三个方面来反映被试的敌对表现。其项目包括从厌烦、争论、摔物，直至争斗和不可抑制的冲动爆发等各个方面。"),
    PHOTIC_ANXIETY("恐怖", "6", "恐怖维度所表现的症状与传统的恐怖状态或广场恐怖症所反映的内容基本一致，恐惧的对象包括出门旅行、空旷场地、人群、或公共场合及交通工具。此外，还有反映社交恐怖的项目，即害怕与他人交往。"),
    PARANOID_IDEATION("偏执", "7", "偏执是一个十分复杂的概念，本偏执维度主要是指思维方面，如投射性思维、敌对、猜疑、关系观念、妄想、被动体验和夸大等。"),
    PSYCHOTICISM("精神病性", "8", "精神病性主要表现为幻听、思维扩散(播散)、被控制感、此外，还有反映非一级症状的精神病表现，如精神分裂症状等项目。"),
    OTHER("其他", "9", "此维度主要用来反应睡眠、饮食及自罪感等方面的情况，通过测试得知被试在睡眠、饮食及自罪观念方面的心理状况，属于健康水平。"),
    SYMPTOM_POSITIVE_COUNT("阳性项目数", "10", "单项分=1的项目数，表示“无症状”的项目有多少"),
    SYMPTOM_NEGATIVE_COUNT("阴性项目数", "11", "单项分≥2的项目数，表示呈现“有症状”的项目有多少。");

    private final String name;
    private final String code;
    private final String desc;

    /**
     * 一个映射，用于根据症状群代码快速检索对应的症状群对象
     * 这个映射是通过遍历所有症状群对象（枚举值）并使用Java Stream API创建的
     * 它使用症状群的代码作为键，症状群对象本身作为值
     * 如果有重复的代码，則保留第一个出现的症状群对象
     */
    private static final Map<String, SymptomCluster> CODE_MAP = Arrays.stream(values())
            .collect(Collectors.toMap(
                    SymptomCluster::getCode, // 使用症状群的代码作为键
                    Function.identity(), // 使用症状群对象本身作为值
                    (existing, replacement) -> existing // 如果有重复的键，保留现有的值
            ));

    SymptomCluster(String name, String code, String desc) {
        this.name = name;
        this.code = code;
        this.desc = desc;
    }

    // 根据数据库值快速获取枚举实例
    public static SymptomCluster fromCode(String code) {
        return CODE_MAP.getOrDefault(code, OTHER); // 未匹配时返回OTHER
    }

    public String getName() {
        return name;
    }

    public String getCode() {
        return code;
    }

    public String getDesc() {
        return desc;
    }
}
